Using the Copy and Set Commands With Script Objects
The Copy and Set commands both assign values to variables, but they have different results when the value assigned is a script object. The Copy command makes a new copy of the script object, and the Set command creates a variable that shares data with the original script object.To see how this works, consider the following example, which defines a script object, called
John
, with a property called Vegetable.
script John property Vegetable: "Spinach"end script set myScriptObject to John set Vegetable of John to "Swiss chard"get Vegetable of myScriptObject --result: "Swiss chard"The first Set command defines a variable, calledmyScriptObject
, that shares data with the original script objectJohn
. The second Set command changes the value of the Vegetable property of script objectJohn
from"
Spinach"
to"
Swiss chard"
. BecausemyScriptObject
shares data withJohn
, it shares the change to the Vegetable property ofJohn
. When you get the Vegetable property ofmyScriptObject
, the result is"
Swiss chard"
.Now consider the following example, which uses the Copy command to define the variable
myScriptObject
.
script John property Vegetable: "Spinach"end script copy John to myScriptObject set Vegetable of John to "Swiss chard"get Vegetable of myScriptObject --result: "Spinach"In this case, the Copy command creates a new script object. Setting the Vegetable property of the original script object has no effect on the new script object. The result of the Get command is"Spinach"
.When you copy a child script object to a variable, the variable contains a complete copy of both the child and its parent, including all the parent's properties and handlers. Each new copy, including its inherited properties
and handlers, is completely independent of both the original and any
other copies.For example, if you copy a modified version of the
JohnSon
script in this example to two different variables, you can set each variable's Vegetable property independently:
script John property Vegetable : "Spinach"end script script JohnSon property parent : John on changeVegetable(x) set my Vegetable to x end changeVegetable end script copy JohnSon to J1 copy JohnSon to J2 tell J1 to changeVegetable("Zucchini") tell J2 to changeVegetable("Swiss chard") Vegetable of J1 --result: "Zucchini" Vegetable of J2 --result: "Swiss chard" Vegetable of John --result: "Spinach"You can create handlers that construct copies of script objects for use elsewhere in a script. For example, the script that follows includes a handler that takes an initial balance as a parameter and creates a copy of a script object that acts as
an independent account. Each copy includes several properties and anon deposit
handler that enables the script object to increment its own balance when it receives a Deposit command.
on makeAccount(initialBalance) script account property StartDate : current date property Balance : initialBalance on deposit(amount) set Balance to Balance + amount end deposit end script end makeaccount set a to makeAccount(3300) set b to makeAccount(33) tell a deposit(30) deposit(60) end tell {Balance of a, StartDate of a} --result: {3390, date "Tuesday, July 6, 1993 2:38:11 PM"} {Balance of b, StartDate of b} --result: {33, date "Tuesday, July 6, 1993 2:38:12 PM"}